// 以数组 intervals 表示若干个区间的集合，其中单个区间为 intervals[i] = [starti, endi] 
// 请你合并所有重叠的区间，并返回一个不重叠的区间数组，该数组需恰好覆盖输入中的所有区间。


/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
// 不能进行连续合并
var merge = function(intervals) {
    // 先进行排序
    intervals.sort((a, b) => a[0] - b[0]);
    let res = []
    for (let i = 0; i < intervals.length; i += 1) {
        //先试着合并两个数组
        let init = intervals[i].concat(intervals[i + 1]);
        if (init[1] < init[2]) { res.push(intervals[i]); continue; }
        // 对合并后的数组进行去重，排序
        let arr = [...new Set(init)].sort((a, b) => { return a - b })
            // 将两个数组转化为字符串（防止拷贝问题）进行比较
        if (!(arr.join('') == init.join(""))) {
            res.push([Math.min(intervals[i][0], intervals[i + 1][0]), Math.max(intervals[i][1], intervals[i + 1][1])]);
            // 一次合并后要跳过已经合并的一项
            i++;
        } else {
            res.push(intervals[i])
        }
    }
    return res;
};

var merge = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0]);
    let res = []
    let prve = intervals[0];
    for (let i = 1; i < intervals.length; i++) {
        cur = intervals[i];
        // 符合条件会贪婪查找
        if (prve[1] >= cur[0]) {
            // 由于前面已经进行了排序，这里就没有必要比较最小值，prve[0]一定是最小值
            prve[1] = Math.max(prve[1], cur[1])
        } else {
            // 不符合条件就推入res中
            res.push(prve);
            prve = cur;
        }
    }
    // 如果最后不再贪婪，应该强制推入
    res.push(prve)
    return res;
};